package site.kitcheng.springboottest.api.controller;

import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.OutputStream;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * ClassName: ExcelController
 * Package: site.kitcheng.springboottest.api.controller
 * Description:
 *
 * @Author jiangCheng
 * @Create 2025/2/10 11:10
 * @Version 1.0
 */
public class ExcelController {

//    public void exportSurfList2( HttpServletResponse response) throws IOException {
//
//
//
////文件名
//        String fileName = String.valueOf(System.currentTimeMillis());
//        OutputStream outputStream = null;
//
//        try {
//            //记录总数: 实际中需要根据查询条件进行统计即可: 一共多少条
//            int totalCount = mapper.seleCount();
//            //默认每个查询的行数
//            Integer writeDataRows = ExcelConstants.PER_WRITE_ROW_COUNT;
//
//            //动态调整每次查询的行数（通过检查数据库负载来调整）
//            writeDataRows = getAdjustedQueryLimit(writeDataRows);  // 动态调整查询行数
//
//            //每一个Sheet存放100w条数据
//            Integer sheetDataRows = ExcelConstants.PER_SHEET_ROW_COUNT;
//
//            //计算需要的Sheet数量
//            Integer sheetNum = totalCount % sheetDataRows == 0 ? (totalCount / sheetDataRows) : (totalCount / sheetDataRows + 1);
//            //计算一般情况下每一个Sheet需要写入的次数(一般情况不包含最后一个sheet, 因为最后一个sheet不确定会写入多少条数据)
//            Integer oneSheetWriteCount = sheetDataRows / writeDataRows;
//            //计算最后一个sheet需要写入的次数
//            Integer lastSheetWriteCount = totalCount % sheetDataRows == 0 ? oneSheetWriteCount :
//                    (totalCount % sheetDataRows % writeDataRows == 0 ? (totalCount / sheetDataRows / writeDataRows) :
//                            ((totalCount % sheetDataRows) / writeDataRows + 1));
//
//            outputStream = response.getOutputStream();
//            //必须放到循环外，否则会刷新流
//            ExcelWriter excelWriter = EasyExcel.write(outputStream).build();
//
//            //异步查询和导出
//            ExecutorService executorService = Executors.newFixedThreadPool(4); // 可调节线程池大小
//            List<Callable<Void>> tasks = new ArrayList<>();
//
//            //开始分批查询分次写入
//            for (int i = 0; i < sheetNum; i++) {
//                final int sheetIndex = i;
//                tasks.add(() -> {
//                    try {
//                        //创建Sheet
//                        WriteSheet sheet = new WriteSheet();
//                        sheet.setSheetName("Sheet" + sheetIndex);
//                        sheet.setSheetNo(sheetIndex);
//
//                        //循环写入次数: j的自增条件是当不是最后一个Sheet的时候写入次数为正常的每个Sheet写入的次数
//                        // 如果是最后一个就需要使用计算的次数 lastSheetWriteCount
//                        for (int j = 0; j < (sheetIndex != sheetNum - 1 ? oneSheetWriteCount : lastSheetWriteCount); j++) {
//                            //分页查询一次
//                            Page page1 = new Page(j + 1 + oneSheetWriteCount * sheetIndex, writeDataRows);
//                            List<Map<String, Object>> list = mapper.selectList(page1.getPageNum(), page1.getPageSize());
//                            List<AltitudeMonExportExcelVO> SurfDayList = new ArrayList<>();
//
//                            //写入到excel
//                            Set<String> includeColumnFiledNames = new HashSet<String>();
//                            includeColumnFiledNames.add("v01301"); // 仅导出某些字段
//
//                            WriteSheet writeSheet = EasyExcel.writerSheet(sheetIndex, "Sheet" + (sheetIndex + 1))
//                                    .head(AltitudeMonExportExcelVO.class)
//                                    .includeColumnFiledNames(includeColumnFiledNames)
//                                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
//                            excelWriter.write(list, writeSheet);
//                        }
//                    } catch (Exception e) {
//                        log.error("Error writing sheet " + sheetIndex, e);
//                    }
//                    return null;
//                });
//            }
//
//            // 执行异步任务
//            executorService.invokeAll(tasks);
//
//            // 下载EXCEL，返回给前端stream流
//            response.setContentType("application/octet-stream");
//            response.setCharacterEncoding("utf-8");
//            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
//            excelWriter.finish();
//            outputStream.flush();
//            outputStream.close();
//            log.info("*********地面统计查询列表导出结束！**************");
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            if (outputStream != null) {
//                try {
//                    outputStream.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//    }
//// 动态调整查询行数的函数
//        private Integer getAdjustedQueryLimit (Integer currentLimit){
//            // 假设我们有一个监控数据库负载的方法：checkDatabaseLoad()
//            int currentLoad = checkDatabaseLoad(); // 返回一个负载值（可以是查询数、连接数、CPU占用等）
//
//            // 基于数据库负载调整查询的行数
//            if (currentLoad < 50) {
//                // 如果数据库负载较低，增加查询的行数
//                return Math.min(currentLimit * 2, ExcelConstants.MAX_WRITE_ROW_COUNT);
//            } else if (currentLoad > 80) {
//                // 如果数据库负载较高，减少查询的行数
//                return Math.max(currentLimit / 2, ExcelConstants.MIN_WRITE_ROW_COUNT);
//            }
//            return currentLimit; // 否则保持当前的查询行数
//        }

    }